package com.kantboot.util.common;

import lombok.SneakyThrows;
import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicMatch;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

/**
 * 用来操作文件的工具类
 */
public class FileIoUtil {

    /**
     * 图片存储优化，自动获取后缀名，用于操作上传时自带后缀名的文件
     * @param img
     * @param imagePath
     */
    @SneakyThrows
    public static String transferTo(MultipartFile img, String imagePath){

        //获取图片名称
        String imgName = img.getOriginalFilename();
        //获取图片备注
        String suffixName = imgName.substring(imgName.indexOf("."));
        //为了图片名字重复，所以生成新的图片名称 UUID+现在的时间戳+文件后缀
        String newImgName = UUID.randomUUID().toString() + new Date().getTime() + suffixName;

        File folder = new File(imagePath);
        if (!folder.isDirectory()) {
            //如果路径不存在则创建路径
            folder.mkdirs();
        }

        File resultFile=new File(folder, newImgName);
        //保存图片到路径
        img.transferTo(new File(folder, newImgName));

        return resultFile.getPath();
    }

    /**
     * 图片存储优化，不会自动获取后缀名
     * @param img
     * @param imagePath
     * @Param suffixName
     */
    @SneakyThrows
    public static void transferTo(MultipartFile img, String imagePath, String suffixName){

        //获取图片名称
        String imgName = img.getOriginalFilename();
        //获取图片备注
        //为了图片名字重复，所以生成新的图片名称 UUID+现在的时间戳+文件后缀
        String newImgName = UUID.randomUUID().toString() + new Date().getTime() + "." + suffixName;

        File folder = new File(imagePath);
        if (!folder.isDirectory()) {
            //如果路径不存在则创建路径
            folder.mkdirs();
        }

        //保存图片到路径
        img.transferTo(new File(folder, newImgName));
    }


    /**
     * 根据路径显示图片
     * @param imagePath
     */
    @SneakyThrows
    public static void showImageByPath(String imagePath, HttpServletResponse response){
        Magic parser = new Magic() ;
        MagicMatch match = parser.getMagicMatch(new File(imagePath),false);
        String contentType = match.getMimeType();
        // 设返回的contentType
        response.setContentType(contentType); //
        // 读取路径下面的文件
        FileCopyUtils.copy(new FileInputStream(imagePath), response.getOutputStream());
    }

    /**
     * 视频存储优化，自动获取后缀名，用于操作上传时自带后缀名的文件
     * @param video
     * @param imagePath
     */
    @SneakyThrows
    public static void videoTransferTo(MultipartFile video, String imagePath){

        //获取图片名称
        String imgName = video.getOriginalFilename();
        //获取图片备注
        String suffixName = imgName.substring(imgName.indexOf("."));
        //为了图片名字重复，所以生成新的图片名称 UUID+现在的时间戳+文件后缀
        String newImgName = UUID.randomUUID().toString() + new Date().getTime() + suffixName;

        File folder = new File(imagePath);
        if (!folder.isDirectory()) {
            //如果路径不存在则创建路径
            folder.mkdirs();
        }

        //保存图片到路径
        video.transferTo(new File(folder, newImgName));
    }

    /**
     * 视频存储优化，不会自动获取后缀名
     * @param video
     * @param imagePath
     * @Param suffixName
     */
    @SneakyThrows
    public static void videoTransferTo(MultipartFile video, String imagePath, String suffixName){
        //获取图片名称
        String videoName = video.getOriginalFilename();
        //获取图片备注
        //为了图片名字重复，所以生成新的图片名称 UUID+现在的时间戳+文件后缀
        String newImgName = UUID.randomUUID().toString() + new Date().getTime() + "." + suffixName;

        File folder = new File(imagePath);
        if (!folder.isDirectory()) {
            //如果路径不存在则创建路径
            folder.mkdirs();
        }

        //保存图片到路径
        video.transferTo(new File(folder, newImgName));
    }

    /**
     * 根据路径显示图片
     * @param imagePath
     */
    @SneakyThrows
    public static void showVideoByPath(String imagePath, HttpServletResponse response){
        HashMap<String,String> hashMap=new HashMap<String,String>();
        hashMap.put(".asf","video/x-ms-asf");
        hashMap.put(".asx","video/x-ms-asf");
        hashMap.put(".avi","video/avi");
        hashMap.put(".IVF","video/x-ivf");
        hashMap.put(".m1v","video/x-mpeg");
        hashMap.put(".m2v","video/x-mpeg");
        hashMap.put(".m4e","video/mpeg4");
        hashMap.put(".movie","video/x-sgi-movie");
        hashMap.put(".mp2v","video/mpeg");
        hashMap.put(".mp4","video/mp4");
        hashMap.put(".mpa","video/x-mpg");
        hashMap.put(".mpe","video/x-mpeg");
        hashMap.put(".mpg","video/mpg");
        hashMap.put(".mpeg","video/mpg");
        hashMap.put(".mps","video/x-mpeg");
        hashMap.put(".mpv","video/mpg");
        hashMap.put(".mpv2","video/mpeg");
        hashMap.put(".wm","video/x-ms-wm");
        hashMap.put(".wmv","video/x-ms-wmv");
        hashMap.put(".wmx","video/x-ms-wmx");
        hashMap.put(".wvx","video/x-ms-wvx");
        File file=new File(imagePath);
        String suffixName = file.getPath().substring(file.getPath().indexOf("."));
        String contentType = hashMap.get(suffixName);
        // 设返回的contentType
        response.setContentType(contentType); //
        // 读取路径下面的文件
        FileCopyUtils.copy(new FileInputStream(imagePath), response.getOutputStream());
    }
}
